리νλ μ λ° μ½λ μμ± κΈ°μ μ ν΅ν΄ TypeScript λ©ν νλ‘κ·Έλλ°μ νꡬν©λλ€. κ°λ ₯ν μΆμνμ ν₯μλ κ°λ° μν¬νλ‘μ°λ₯Ό μν΄ μ»΄νμΌ μμ μ½λλ₯Ό λΆμνκ³ μ‘°μνλ λ°©λ²μ λ°°μλλ€.
TypeScript λ©ν νλ‘κ·Έλλ°: 리νλ μ λ° μ½λ μμ±
λ€λ₯Έ μ½λλ₯Ό μ‘°μνλ μ½λλ₯Ό μμ±νλ κΈ°μ μΈ λ©ν νλ‘κ·Έλλ°μ TypeScriptμμ ν₯λ―Έλ‘μ΄ κ°λ₯μ±μ μ΄μ΄μ€λλ€. μ΄ κ²μκΈμμλ 리νλ μ λ° μ½λ μμ± κΈ°μ μ μ¬μ©νμ¬ λ©ν νλ‘κ·Έλλ° μμμ νꡬνκ³ μ»΄νμΌ μ€μ μ½λλ₯Ό λΆμνκ³ μμ νλ λ°©λ²μ μ΄ν΄λ΄ λλ€. λ°μ½λ μ΄ν° λ° TypeScript μ»΄νμΌλ¬ APIμ κ°μ κ°λ ₯ν λꡬλ₯Ό κ²ν νμ¬ κ°λ ₯νκ³ νμ₯ κ°λ₯νλ©° μ μ§ κ΄λ¦¬κ° μ©μ΄ν μ ν리μΌμ΄μ μ ꡬμΆν μ μλλ‘ μ§μν©λλ€.
λ©ν νλ‘κ·Έλλ°μ΄λ 무μμ λκΉ?
ν΅μ¬μ μΌλ‘ λ©ν νλ‘κ·Έλλ°μ λ€λ₯Έ μ½λμμ μλνλ μ½λλ₯Ό μμ±νλ κ²μ μλ―Έν©λλ€. μ΄λ₯Ό ν΅ν΄ μ»΄νμΌ νμ λλ λ°νμμ μ½λλ₯Ό λμ μΌλ‘ μμ±, λΆμ λλ λ³νν μ μμ΅λλ€. TypeScriptμμ λ©ν νλ‘κ·Έλλ°μ μ£Όλ‘ μ»΄νμΌ νμ μμ μ μ€μ μ λλ©° νμ μμ€ν κ³Ό μ»΄νμΌλ¬ μ체λ₯Ό νμ©νμ¬ κ°λ ₯ν μΆμνλ₯Ό λ¬μ±ν©λλ€.
Python λλ Rubyμ κ°μ μΈμ΄μμ λ³Ό μ μλ λ°νμ λ©ν νλ‘κ·Έλλ° μ κ·Ό λ°©μκ³Ό λΉκ΅νμ¬ TypeScriptμ μ»΄νμΌ νμ μ κ·Ό λ°©μμ λ€μκ³Ό κ°μ μ΄μ μ μ 곡ν©λλ€.
- νμ μμ μ±: μ»΄νμΌ μ€μ μ€λ₯κ° ν¬μ°©λμ΄ μκΈ°μΉ μμ λ°νμ λμμ λ°©μ§ν©λλ€.
- μ±λ₯: μ½λ μμ± λ° μ‘°μμ λ°νμ μ μ λ°μνμ¬ μ΅μ νλ μ½λ μ€νμ μ 곡ν©λλ€.
- Intellisense λ° μλ μμ±: λ©ν νλ‘κ·Έλλ° κ΅¬λ¬Έμ TypeScript μΈμ΄ μλΉμ€μμ μ΄ν΄ν μ μμΌλ―λ‘ λ λμ κ°λ°μ λꡬ μ§μμ μ 곡ν©λλ€.
TypeScriptμ 리νλ μ
λ©ν νλ‘κ·Έλλ°μ λ§₯λ½μμ 리νλ μ μ νλ‘κ·Έλ¨μ΄ μ체 ꡬ쑰μ λμμ κ²μ¬νκ³ μμ νλ λ₯λ ₯μ λλ€. TypeScriptμμ μ΄λ μ£Όλ‘ μ»΄νμΌ νμμ νμ , ν΄λμ€, μμ± λ° λ©μλλ₯Ό κ²μ¬νλ κ²κ³Ό κ΄λ ¨λ©λλ€. TypeScriptμλ Java λλ .NETκ³Ό κ°μ κΈ°μ‘΄ λ°νμ 리νλ μ μμ€ν μ΄ μμ§λ§ νμ μμ€ν κ³Ό λ°μ½λ μ΄ν°λ₯Ό νμ©νμ¬ μ μ¬ν ν¨κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
λ°μ½λ μ΄ν°: λ©ν νλ‘κ·Έλλ°μ μν μ΄λ Έν μ΄μ
λ°μ½λ μ΄ν°λ ν΄λμ€, λ©μλ, μμ± λ° λ§€κ°λ³μμ λμμ μΆκ°νκ³ μμ νλ λ°©λ²μ μ 곡νλ TypeScriptμ κ°λ ₯ν κΈ°λ₯μ λλ€. μ΄λ μ»΄νμΌ νμ λ©ν νλ‘κ·Έλλ° λꡬ μν μ νμ¬ μ¬μ©μ μ μ λ‘μ§ λ° λ©νλ°μ΄ν°λ₯Ό μ½λμ μ½μ ν μ μμ΅λλ€.
λ°μ½λ μ΄ν°λ @ κΈ°νΈμ λ°μ½λ μ΄ν° μ΄λ¦μΌλ‘ μ μΈλ©λλ€. μ΄λ λ€μκ³Ό κ°μ μ©λλ‘ μ¬μ©ν μ μμ΅λλ€.
- ν΄λμ€ λλ λ©€λ²μ λ©νλ°μ΄ν°λ₯Ό μΆκ°ν©λλ€.
- ν΄λμ€ μ μλ₯Ό μμ ν©λλ€.
- λ©μλλ₯Ό λννκ±°λ λ체ν©λλ€.
- ν΄λμ€ λλ λ©μλλ₯Ό μ€μ λ μ§μ€νΈλ¦¬μ λ±λ‘ν©λλ€.
μμ : λ‘κΉ λ°μ½λ μ΄ν°
λ©μλ νΈμΆμ λ‘κΉ νλ κ°λ¨ν λ°μ½λ μ΄ν°λ₯Ό λ§λ€μ΄ λ³΄κ² μ΅λλ€.
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling method ${propertyKey} with arguments: ${JSON.stringify(args)}`);
const result = originalMethod.apply(this, args);
console.log(`Method ${propertyKey} returned: ${result}`);
return result;
};
return descriptor;
}
class MyClass {
@logMethod
add(x: number, y: number): number {
return x + y;
}
}
const myInstance = new MyClass();
myInstance.add(5, 3);
μ΄ μμ μμ @logMethod λ°μ½λ μ΄ν°λ add λ©μλμ λν νΈμΆμ κ°λ‘μ±μ μΈμμ λ°ν κ°μ λ‘κΉ
ν λ€μ μλ λ©μλλ₯Ό μ€νν©λλ€. μ΄λ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ ν΄λμ€μ ν΅μ¬ λ‘μ§μ μμ νμ§ μκ³ λ λ‘κΉ
λλ μ±λ₯ λͺ¨λν°λ§κ³Ό κ°μ ν‘λ¨ κ΄μ¬μ¬λ₯Ό μΆκ°ν μ μλ λ°©λ²μ 보μ¬μ€λλ€.
λ°μ½λ μ΄ν° ν©ν 리
λ°μ½λ μ΄ν° ν©ν 리λ₯Ό μ¬μ©νλ©΄ λ§€κ°λ³μνλ λ°μ½λ μ΄ν°λ₯Ό λ§λ€μ΄ λ μ μ°νκ³ μ¬μ¬μ© κ°λ₯νκ² λ§λ€ μ μμ΅λλ€. λ°μ½λ μ΄ν° ν©ν 리λ λ°μ½λ μ΄ν°λ₯Ό λ°ννλ ν¨μμ λλ€.
function logMethodWithPrefix(prefix: string) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`${prefix} - Calling method ${propertyKey} with arguments: ${JSON.stringify(args)}`);
const result = originalMethod.apply(this, args);
console.log(`${prefix} - Method ${propertyKey} returned: ${result}`);
return result;
};
return descriptor;
};
}
class MyClass {
@logMethodWithPrefix("DEBUG")
add(x: number, y: number): number {
return x + y;
}
}
const myInstance = new MyClass();
myInstance.add(5, 3);
μ΄ μμ μμ logMethodWithPrefixλ μ λμ¬λ₯Ό μΈμλ‘ μ¬μ©νλ λ°μ½λ μ΄ν° ν©ν 리μ
λλ€. λ°νλ λ°μ½λ μ΄ν°λ μ§μ λ μ λμ¬λ₯Ό μ¬μ©νμ¬ λ©μλ νΈμΆμ λ‘κΉ
ν©λλ€. μ΄λ₯Ό ν΅ν΄ 컨ν
μ€νΈμ λ°λΌ λ‘κΉ
λμμ μ¬μ©μ μ μν μ μμ΅λλ€.
`reflect-metadata`λ₯Ό μ¬μ©ν λ©νλ°μ΄ν° 리νλ μ
reflect-metadata λΌμ΄λΈλ¬λ¦¬λ ν΄λμ€, λ©μλ, μμ± λ° λ§€κ°λ³μμ κ΄λ ¨λ λ©νλ°μ΄ν°λ₯Ό μ μ₯νκ³ κ²μνλ νμ€ λ°©λ²μ μ 곡ν©λλ€. μ½λμ μμμ λ°μ΄ν°λ₯Ό 첨λΆνκ³ λ°νμ(λλ νμ
μ μΈμ ν΅ν΄ μ»΄νμΌ νμ)μ μ‘μΈμ€ν μ μλλ‘ νμ¬ λ°μ½λ μ΄ν°λ₯Ό 보μν©λλ€.
reflect-metadataλ₯Ό μ¬μ©νλ €λ©΄ λ€μμ μ€μΉν΄μΌ ν©λλ€.
npm install reflect-metadata --save
κ·Έλ¦¬κ³ tsconfig.jsonμμ emitDecoratorMetadata μ»΄νμΌλ¬ μ΅μ
μ νμ±νν©λλ€.
{
"compilerOptions": {
"emitDecoratorMetadata": true
}
}
μμ : μμ± μ ν¨μ± κ²μ¬
λ©νλ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ μμ± κ°μ μ ν¨μ± κ²μ¬νλ λ°μ½λ μ΄ν°λ₯Ό λ§λ€μ΄ λ³΄κ² μ΅λλ€.
import 'reflect-metadata';
const requiredMetadataKey = Symbol("required");
function required(target: Object, propertyKey: string | symbol, parameterIndex: number) {
let existingRequiredParameters: number[] = Reflect.getOwnMetadata(requiredMetadataKey, target, propertyKey) || [];
existingRequiredParameters.push(parameterIndex);
Reflect.defineMetadata(requiredMetadataKey, existingRequiredParameters, target, propertyKey);
}
function validate(target: any, propertyName: string, descriptor: TypedPropertyDescriptor) {
let method = descriptor.value!;
descriptor.value = function () {
let requiredParameters: number[] = Reflect.getOwnMetadata(requiredMetadataKey, target, propertyName);
if (requiredParameters) {
for (let parameterIndex of requiredParameters) {
if (arguments.length <= parameterIndex || arguments[parameterIndex] === undefined) {
throw new Error("Missing required argument.");
}
}
}
return method.apply(this, arguments);
};
}
class MyClass {
myMethod(@required param1: string, param2: number) {
console.log(param1, param2);
}
}
μ΄ μμ μμ @required λ°μ½λ μ΄ν°λ λ§€κ°λ³μλ₯Ό νμλ‘ νμν©λλ€. validate λ°μ½λ μ΄ν°λ λ©μλ νΈμΆμ κ°λ‘μ±μ λͺ¨λ νμ λ§€κ°λ³μκ° μλμ§ νμΈν©λλ€. νμ λ§€κ°λ³μκ° μμΌλ©΄ μ€λ₯κ° λ°μν©λλ€. μ΄λ reflect-metadataλ₯Ό μ¬μ©νμ¬ λ©νλ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ μ ν¨μ± κ²μ¬ κ·μΉμ μ μ©ν μ μλ λ°©λ²μ 보μ¬μ€λλ€.
TypeScript μ»΄νμΌλ¬ APIλ₯Ό μ¬μ©ν μ½λ μμ±
TypeScript μ»΄νμΌλ¬ APIλ TypeScript μ»΄νμΌλ¬μ λν νλ‘κ·Έλλ° λ°©μ μ‘μΈμ€λ₯Ό μ 곡νμ¬ TypeScript μ½λλ₯Ό λΆμ, λ³ν λ° μμ±ν μ μλλ‘ ν©λλ€. μ΄λ₯Ό ν΅ν΄ λ©ν νλ‘κ·Έλλ°μ μν κ°λ ₯ν κ°λ₯μ±μ΄ μ΄λ¦¬κ³ μ¬μ©μ μ μ μ½λ μμ±κΈ°, λ¦°ν° λ° κΈ°ν κ°λ° λꡬλ₯Ό ꡬμΆν μ μμ΅λλ€.
μΆμ ꡬ문 νΈλ¦¬(AST) μ΄ν΄
μ»΄νμΌλ¬ APIλ₯Ό μ¬μ©ν μ½λ μμ±μ κΈ°μ΄λ μΆμ ꡬ문 νΈλ¦¬(AST)μ λλ€. ASTλ TypeScript μ½λμ νΈλ¦¬μ κ°μ ννμ΄λ©°, νΈλ¦¬μ κ° λ Έλλ ν΄λμ€, ν¨μ, λ³μ λλ μκ³Ό κ°μ ꡬ문 μμλ₯Ό λνλ λλ€.
μ»΄νμΌλ¬ APIλ ASTλ₯Ό νμνκ³ μ‘°μνλ ν¨μλ₯Ό μ 곡νμ¬ μ½λ ꡬ쑰λ₯Ό λΆμνκ³ μμ ν μ μμ΅λλ€. ASTλ₯Ό μ¬μ©νμ¬ λ€μμ μνν μ μμ΅λλ€.
- μ½λμ λν μ 보λ₯Ό μΆμΆν©λλ€(μ: νΉμ μΈν°νμ΄μ€λ₯Ό ꡬννλ λͺ¨λ ν΄λμ€ μ°ΎκΈ°).
- μ½λλ₯Ό λ³νν©λλ€(μ: μλμΌλ‘ λ¬Έμ μ£Όμ μμ±).
- μ μ½λλ₯Ό μμ±ν©λλ€(μ: λ°μ΄ν° μ‘μΈμ€ κ°μ²΄μ λν μμ©κ΅¬ μ½λ μμ±).
μ½λ μμ± λ¨κ³
μ»΄νμΌλ¬ APIλ₯Ό μ¬μ©ν μ½λ μμ±μ μΌλ°μ μΈ μν¬νλ‘λ λ€μ λ¨κ³λ₯Ό ν¬ν¨ν©λλ€.
- TypeScript μ½λ ꡬ문 λΆμ:
ts.createSourceFileν¨μλ₯Ό μ¬μ©νμ¬ κ΅¬λ¬Έ λΆμλ TypeScript μ½λλ₯Ό λνλ΄λ SourceFile κ°μ²΄λ₯Ό λ§λλλ€. - AST νμ:
ts.visitNodeλ°ts.visitEachChildν¨μλ₯Ό μ¬μ©νμ¬ ASTλ₯Ό μ¬κ·μ μΌλ‘ νμνκ³ κ΄μ¬ μλ λ Έλλ₯Ό μ°Ύμ΅λλ€. - AST λ³ν: μ AST λ Έλλ₯Ό λ§λ€κ±°λ κΈ°μ‘΄ λ Έλλ₯Ό μμ νμ¬ μνλ λ³νμ ꡬνν©λλ€.
- TypeScript μ½λ μμ±:
ts.createPrinterν¨μλ₯Ό μ¬μ©νμ¬ μμ λ ASTμμ TypeScript μ½λλ₯Ό μμ±ν©λλ€.
μμ : λ°μ΄ν° μ μ‘ κ°μ²΄(DTO) μμ±
ν΄λμ€ μ μλ₯Ό κΈ°λ°μΌλ‘ λ°μ΄ν° μ μ‘ κ°μ²΄(DTO) μΈν°νμ΄μ€λ₯Ό μμ±νλ κ°λ¨ν μ½λ μμ±κΈ°λ₯Ό λ§λ€μ΄ λ³΄κ² μ΅λλ€.
import * as ts from "typescript";
import * as fs from "fs";
function generateDTO(sourceFile: ts.SourceFile, className: string): string | undefined {
let interfaceName = className + "DTO";
let properties: string[] = [];
function visit(node: ts.Node) {
if (ts.isClassDeclaration(node) && node.name?.text === className) {
node.members.forEach(member => {
if (ts.isPropertyDeclaration(member) && member.name) {
let propertyName = member.name.getText(sourceFile);
let typeName = "any"; // Default type
if (member.type) {
typeName = member.type.getText(sourceFile);
}
properties.push(` ${propertyName}: ${typeName};`);
}
});
}
}
ts.visitNode(sourceFile, visit);
if (properties.length > 0) {
return `interface ${interfaceName} {\n${properties.join("\n")}\n}`;
}
return undefined;
}
// Example Usage
const fileName = "./src/my_class.ts"; // Replace with your file path
const classNameToGenerateDTO = "MyClass";
fs.readFile(fileName, (err, buffer) => {
if (err) {
console.error("Error reading file:", err);
return;
}
const sourceCode = buffer.toString();
const sourceFile = ts.createSourceFile(
fileName,
sourceCode,
ts.ScriptTarget.ES2015,
true
);
const dtoInterface = generateDTO(sourceFile, classNameToGenerateDTO);
if (dtoInterface) {
console.log(dtoInterface);
} else {
console.log(`Class ${classNameToGenerateDTO} not found or no properties to generate DTO from.`);
}
});
my_class.ts:
class MyClass {
name: string;
age: number;
isActive: boolean;
}
μ΄ μμ λ TypeScript νμΌμ μ½κ³ , μ§μ λ μ΄λ¦μ ν΄λμ€λ₯Ό μ°Ύκ³ , ν΄λΉ μμ±κ³Ό νμ μ μΆμΆνκ³ , λμΌν μμ±μ κ°μ§ DTO μΈν°νμ΄μ€λ₯Ό μμ±ν©λλ€. μΆλ ₯μ λ€μκ³Ό κ°μ΅λλ€.
interface MyClassDTO {
name: string;
age: number;
isActive: boolean;
}
μ€λͺ :
fs.readFileμ μ¬μ©νμ¬ TypeScript νμΌμ μμ€ μ½λλ₯Ό μ½μ΅λλ€.ts.createSourceFileμ μ¬μ©νμ¬ μμ€ μ½λμμts.SourceFileμ μμ±ν©λλ€. μ΄λ ꡬ문 λΆμλ μ½λλ₯Ό λνλ λλ€.generateDTOν¨μλ ASTλ₯Ό λ°©λ¬Έν©λλ€. μ§μ λ μ΄λ¦μ ν΄λμ€ μ μΈμ΄ λ°κ²¬λλ©΄ ν΄λμ€μ λ©€λ²λ₯Ό λ°λ³΅ν©λλ€.- κ° μμ± μ μΈμ λν΄ μμ± μ΄λ¦κ³Ό νμ
μ μΆμΆνμ¬
propertiesλ°°μ΄μ μΆκ°ν©λλ€. - λ§μ§λ§μΌλ‘ μΆμΆλ μμ±μ μ¬μ©νμ¬ DTO μΈν°νμ΄μ€ λ¬Έμμ΄μ ꡬμ±νκ³ λ°νν©λλ€.
μ½λ μμ±μ μ€μ μμ© νλ‘κ·Έλ¨
μ»΄νμΌλ¬ APIλ₯Ό μ¬μ©ν μ½λ μμ±μλ λ€μκ³Ό κ°μ λ€μν μ€μ μμ© νλ‘κ·Έλ¨μ΄ μμ΅λλ€.
- μμ©κ΅¬ μ½λ μμ±: λ°μ΄ν° μ‘μΈμ€ κ°μ²΄, API ν΄λΌμ΄μΈνΈ λλ κΈ°ν λ°λ³΅μ μΈ μμ μ λν μ½λλ₯Ό μλμΌλ‘ μμ±ν©λλ€.
- μ¬μ©μ μ μ λ¦°ν° μμ±: ASTλ₯Ό λΆμνκ³ μ μ¬μ μΈ λ¬Έμ λ₯Ό μλ³νμ¬ μ½λ© νμ€ λ° λͺ¨λ² μ¬λ‘λ₯Ό μ μ©ν©λλ€.
- λ¬Έμ μμ±: ASTμμ μ 보λ₯Ό μΆμΆνμ¬ API λ¬Έμλ₯Ό μμ±ν©λλ€.
- 리ν©ν°λ§ μλν: ASTλ₯Ό λ³ννμ¬ μ½λλ₯Ό μλμΌλ‘ 리ν©ν°λ§ν©λλ€.
- λλ©μΈ νΉμ μΈμ΄(DSL) ꡬμΆ: νΉμ λλ©μΈμ λ§λ μ¬μ©μ μ μ μΈμ΄λ₯Ό λ§λ€κ³ TypeScript μ½λλ₯Ό μμ±ν©λλ€.
κ³ κΈ λ©ν νλ‘κ·Έλλ° κΈ°μ
λ°μ½λ μ΄ν° λ° μ»΄νμΌλ¬ API μΈμλ TypeScriptμμ λ©ν νλ‘κ·Έλλ°μ μ¬μ©ν μ μλ μ¬λ¬ λ€λ₯Έ κΈ°μ μ΄ μμ΅λλ€.
- μ‘°κ±΄λΆ νμ : μ‘°κ±΄λΆ νμ μ μ¬μ©νμ¬ λ€λ₯Έ νμ μ κΈ°λ°μΌλ‘ νμ μ μ μνμ¬ μ μ°νκ³ μ μ κ°λ₯ν νμ μ μλ₯Ό λ§λ€ μ μμ΅λλ€. μλ₯Ό λ€μ΄ ν¨μμ λ°ν νμ μ μΆμΆνλ νμ μ λ§λ€ μ μμ΅λλ€.
- λ§€νλ νμ : μμ±μ λ§€ννμ¬ κΈ°μ‘΄ νμ μ λ³ννμ¬ μμ λ μμ± νμ λλ μ΄λ¦μΌλ‘ μ νμ μ λ§λ€ μ μμ΅λλ€. μλ₯Ό λ€μ΄ λ€λ₯Έ νμ μ λͺ¨λ μμ±μ μ½κΈ° μ μ©μΌλ‘ λ§λλ νμ μ λ§λλλ€.
- νμ μΆλ‘ : TypeScriptμ νμ μΆλ‘ κΈ°λ₯μ νμ©νμ¬ μ½λμ λ°λΌ νμ μ μλμΌλ‘ μΆλ‘ νμ¬ λͺ μμ νμ μ΄λ Έν μ΄μ μ νμμ±μ μ€μ λλ€.
- ν νλ¦Ώ 리ν°λ΄ νμ : ν νλ¦Ώ 리ν°λ΄ νμ μ μ¬μ©νμ¬ μ½λ μμ± λλ μ ν¨μ± κ²μ¬μ μ¬μ©ν μ μλ λ¬Έμμ΄ κΈ°λ° νμ μ λ§λλλ€. μλ₯Ό λ€μ΄ λ€λ₯Έ μμλ₯Ό κΈ°λ°μΌλ‘ νΉμ ν€λ₯Ό μμ±ν©λλ€.
λ©ν νλ‘κ·Έλλ°μ μ΄μ
λ©ν νλ‘κ·Έλλ°μ TypeScript κ°λ°μμ λ€μκ³Ό κ°μ μ¬λ¬ μ΄μ μ μ 곡ν©λλ€.
- μ½λ μ¬μ¬μ©μ± ν₯μ: μ ν리μΌμ΄μ μ μ¬λ¬ λΆλΆμ μ μ©ν μ μλ μ¬μ¬μ© κ°λ₯ν κ΅¬μ± μμ λ° μΆμνλ₯Ό λ§λλλ€.
- μμ©κ΅¬ μ½λ κ°μ: λ°λ³΅μ μΈ μ½λλ₯Ό μλμΌλ‘ μμ±νμ¬ μλ μ½λ©μ νμν μμ μ€μ λλ€.
- μ½λ μ μ§ κ΄λ¦¬μ± ν₯μ: κ΄μ¬μ¬λ₯Ό λΆλ¦¬νκ³ λ©ν νλ‘κ·Έλλ°μ μ¬μ©νμ¬ ν‘λ¨ κ΄μ¬μ¬λ₯Ό μ²λ¦¬νμ¬ μ½λλ₯Ό λ λͺ¨λννκ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
- νμ μμ μ± ν₯μ: μ»΄νμΌ μ€μ μ€λ₯λ₯Ό ν¬μ°©νμ¬ μκΈ°μΉ μμ λ°νμ λμμ λ°©μ§ν©λλ€.
- μμ°μ± ν₯μ: μμ μ μλννκ³ κ°λ° μν¬νλ‘μ°λ₯Ό κ°μννμ¬ μμ°μ±μ ν₯μμν΅λλ€.
λ©ν νλ‘κ·Έλλ°μ κ³Όμ
λ©ν νλ‘κ·Έλλ°μ μλΉν μ΄μ μ μ 곡νμ§λ§ λͺ κ°μ§ κ³Όμ λ μ μν©λλ€.
- 볡μ‘μ± μ¦κ°: λ©ν νλ‘κ·Έλλ°μ νΉν κ΄λ ¨λ κΈ°μ μ μ΅μνμ§ μμ κ°λ°μμ κ²½μ° μ½λλ₯Ό λ 볡μ‘νκ³ μ΄ν΄νκΈ° μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€.
- λλ²κΉ μ΄λ €μ: μ€νλλ μ½λκ° μμ€ μ½λμ μ§μ νμλμ§ μμ μ μμΌλ―λ‘ λ©ν νλ‘κ·Έλλ° μ½λ λλ²κΉ μ κΈ°μ‘΄ μ½λ λλ²κΉ λ³΄λ€ λ μ΄λ €μΈ μ μμ΅λλ€.
- μ±λ₯ μ€λ²ν€λ: μ½λ μμ± λ° μ‘°μμ νΉν μ μ€νκ² μννμ§ μμΌλ©΄ μ±λ₯ μ€λ²ν€λλ₯Ό μ λ°ν μ μμ΅λλ€.
- νμ΅ κ³‘μ : λ©ν νλ‘κ·Έλλ° κΈ°μ μ λ§μ€ν°νλ €λ©΄ μλΉν μκ°κ³Ό λ Έλ ₯μ΄ νμν©λλ€.
κ²°λ‘
리νλ μ λ° μ½λ μμ±μ ν΅ν TypeScript λ©ν νλ‘κ·Έλλ°μ κ°λ ₯νκ³ νμ₯ κ°λ₯νλ©° μ μ§ κ΄λ¦¬μ±μ΄ λ°μ΄λ μ ν리μΌμ΄μ μ ꡬμΆνκΈ° μν κ°λ ₯ν λꡬλ₯Ό μ 곡ν©λλ€. λ°μ½λ μ΄ν°, TypeScript μ»΄νμΌλ¬ API λ° κ³ κΈ νμ μμ€ν κΈ°λ₯μ νμ©νμ¬ μμ μ μλννκ³ , μμ©κ΅¬ μ½λλ₯Ό μ€μ΄κ³ , μ½λμ μ λ°μ μΈ νμ§μ ν₯μμν¬ μ μμ΅λλ€. λ©ν νλ‘κ·Έλλ°μ λͺ κ°μ§ κ³Όμ λ₯Ό μ μνμ§λ§ μ 곡νλ μ΄μ μ μλ ¨λ TypeScript κ°λ°μμκ² κ°μΉ μλ κΈ°μ μ λλ€.
λ©ν νλ‘κ·Έλλ°μ νμ νμ©νκ³ TypeScript νλ‘μ νΈμμ μλ‘μ΄ κ°λ₯μ±μ μ΄μ΄λ³΄μΈμ. μ 곡λ μμ λ₯Ό νμνκ³ , λ€μν κΈ°μ μ μ€ννκ³ , λ©ν νλ‘κ·Έλλ°μ΄ λ λμ μννΈμ¨μ΄λ₯Ό ꡬμΆνλ λ° μ΄λ»κ² λμμ΄ λλμ§ μμ보μΈμ.